package com.fuhao.springbootactivemq.config;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.RedeliveryPolicy;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

import javax.jms.Queue;
import javax.jms.Topic;

/**
 * @author zhang
 * @title: ActiveMqConfig
 * @projectName springboot-activemq
 * @description: TODO
 * @date 2019/5/1717:57
 */
@EnableJms
@Component
public class ActiveMqConfig {
    @Bean
    public Queue queue(){
        return new ActiveMQQueue("queue1");
    }
    @Bean
    public Topic topic(){
        return new ActiveMQTopic("topic1");
    }

    /**
     * 重试机制配置
     */
    @Bean
    public RedeliveryPolicy redeliveryPolicy(){
        RedeliveryPolicy  redeliveryPolicy=   new RedeliveryPolicy();
        //是否在每次尝试重新发送失败后,增长这个等待时间
        redeliveryPolicy.setUseExponentialBackOff(true);
        //重发次数,默认为6次   这里设置为3次
        redeliveryPolicy.setMaximumRedeliveries(3);
        //重发时间间隔,默认为1秒
        redeliveryPolicy.setInitialRedeliveryDelay(1);
        //第一次失败后重新发送之前等待500毫秒,第二次失败再等待500 * 2毫秒,这里的2就是value
        redeliveryPolicy.setBackOffMultiplier(2);
        //是否避免消息碰撞
        redeliveryPolicy.setUseCollisionAvoidance(false);
        //设置重发最大拖延时间-1 表示没有拖延只有UseExponentialBackOff(true)为true时生效
        redeliveryPolicy.setMaximumRedeliveryDelay(-1);
        return redeliveryPolicy;
    }

    /**
     * 设置MQ连接工程
     */
    @Bean
    public ActiveMQConnectionFactory activeMQConnectionFactory (RedeliveryPolicy redeliveryPolicy){
        //为了方便这里的连接字符串写死了
        ActiveMQConnectionFactory activeMQConnectionFactory =
                new ActiveMQConnectionFactory(
                        "admin",
                        "admin",
                        "tcp://127.0.0.1:61616");
        activeMQConnectionFactory.setTrustAllPackages(true);
        activeMQConnectionFactory.setRedeliveryPolicy(redeliveryPolicy);
        return activeMQConnectionFactory;
    }

    /**
     * topic模式的ListenerContainer
     */
    @Bean("topicListenerFactory")
    public JmsListenerContainerFactory<?> topicListenerFactory(ActiveMQConnectionFactory activeMQConnectionFactory) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        //ActiveMQConnectionFactory connectionFactor=new ActiveMQConnectionFactory();
        factory.setPubSubDomain(true);//topic模式
        factory.setSessionTransacted(false);//不开启事务
        factory.setSessionAcknowledgeMode(4);//手动签收
        factory.setConnectionFactory(activeMQConnectionFactory);
        return factory;
    }

    /**
     * queue模式的ListenerContainer
     */
    @Bean("queueListenerFactory")
    public JmsListenerContainerFactory<?> queueListenerFactory(ActiveMQConnectionFactory activeMQConnectionFactory) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        //ActiveMQConnectionFactory connectionFactor=new ActiveMQConnectionFactory();
        factory.setPubSubDomain(false);//队列模式
        factory.setSessionTransacted(false);//不开启事务
        factory.setSessionAcknowledgeMode(4);//手动签收
        factory.setConnectionFactory(activeMQConnectionFactory);
        return factory;
    }

    /**
     *  queueTemplate设置
     */
    @Bean("jmsQueueTemplate")
    public JmsTemplate jmsQueueTemplate(ActiveMQConnectionFactory activeMQConnectionFactory){
        JmsTemplate jmsTemplate=new JmsTemplate();
        jmsTemplate.setDeliveryMode(2);//1表示非持久化，2表示持久化
        jmsTemplate.setConnectionFactory(activeMQConnectionFactory);
        //jmsTemplate.setDefaultDestination(queue); //此处可不设置默认，在发送消息时也可设置队列
        jmsTemplate.setSessionTransacted(false);//不开启事务，此处为true时，签收模式默认为自动签收
        jmsTemplate.setPubSubDomain(false);//false表示队列模式
        jmsTemplate.setSessionAcknowledgeMode(4);//客户端签收模式
        return jmsTemplate;
    }

    /**
     *  queueTemplate设置
     */
    @Bean("jmsTopicTemplate")
    public JmsTemplate jmsTopicTemplate(ActiveMQConnectionFactory activeMQConnectionFactory){
        JmsTemplate jmsTopicTemplate=new JmsTemplate();
        jmsTopicTemplate.setDeliveryMode(2);//1表示非持久化，2表示持久化
        jmsTopicTemplate.setConnectionFactory(activeMQConnectionFactory);
        //jmsTemplate.setDefaultDestination(queue); //此处可不设置默认，在发送消息时也可设置队列
        jmsTopicTemplate.setSessionTransacted(false);//不开启事务，此处为true时，签收模式默认为自动签收
        jmsTopicTemplate.setPubSubDomain(true);//false表示队列模式
        jmsTopicTemplate.setSessionAcknowledgeMode(4);//客户端签收模式
        return jmsTopicTemplate;
    }
}
